package cn.demoncat.util.lang.entity.data;

/**
 * 数组栈 - 固定容量
 * 
 * @author 延晓磊
 *
 * @since 2020年6月28日
 */
public class ArrayStack<E> implements Stack<E> {
	
	// 栈
	private final Object[] stack;
	// 栈顶
	private int top = -1;
	// 栈容量
	private final int maxSize;
	 
	/**
	 * 构建栈
	 * 
	 * @param maxSize	栈容量
	 * 
	 * @author 延晓磊
	 *
	 * @since 2020年6月28日
	 */
    public ArrayStack(int maxSize) {
    	this.maxSize = maxSize;
        this.stack = new Object[maxSize];
    }
    
    /**
     * 是否满栈
     * 
     * @return
     * 
     * @author 延晓磊
     *
     * @since 2020年6月28日
     */
    public boolean isFull() {
    	return top == maxSize - 1;
    }

    /**
     * 是否空栈
     * 
     * @return
     * 
     * @author 延晓磊
     *
     * @since 2020年6月28日
     */
    @Override
    public boolean isEmpty() {
    	return top == - 1;
    }
    
    /**
     * 入栈
     * 
     * @param e
     * 
     * @throws RuntimeException 栈满
     * 
     * @author 延晓磊
     *
     * @since 2020年6月28日
     */
    @Override
    public void push(E e) {
    	// 满栈
    	if (isFull()) {
    		throw FULL_EX;
		}
    	// 压入栈顶
    	top ++;
    	stack[top] = e;
    }

    /**
     * 出栈
     * 
     * @return
     * 
     * @throws RuntimeException 栈空
     * 
     * @author 延晓磊
     *
     * @since 2020年6月28日
     */
    @Override
    @SuppressWarnings("unchecked")
	public E pop() {
    	// 空栈
    	if (isEmpty()) {
			throw EMPTY_EX;
		}
    	// 弹出栈顶
    	Object e = stack[top];
    	// 删除栈顶（数据并未清除，只是逻辑上前移指针）
    	top --;
        return e == null ? null : (E) e;
    }

    /**
     * 查看栈顶
     * 
     * @return 空栈返回null
     * 
     * @author 延晓磊
     *
     * @since 2020年6月28日
     */
    @Override
    @SuppressWarnings("unchecked")
	public E peek() {
    	// 空栈
    	if (isEmpty()) {
			return null;
		}
    	// 查看栈顶
    	Object e = stack[top];
        return e == null ? null : (E) e;
    }
    
    /**
     * 栈长
     * 
     * @return
     * 
     * @author 延晓磊
     *
     * @since 2020年6月28日
     */
    @Override
    public int size() {
    	return top + 1;
    }
    
    /**
     * 栈容量
     * 
     * @return
     * 
     * @author 延晓磊
     *
     * @since 2020年6月28日
     */
    public int maxSize() {
    	return maxSize;
    }

    /**
     * 打印
     * 
     * @return
     *
     * @author 延晓磊
     *
     * @since 2020年6月28日
     */
	@Override
	public String toString() {
		// 空栈
		if (isEmpty()) {
			return "[]";
		}
		// 栈顶 > 栈底
        StringBuilder str = new StringBuilder();
		str.append('[');
        for (int i = top; i >= 0; i--) {
        	str.append(stack[i]);
			if (i > 0) {
				str.append(", ");
			}else {
				str.append("]");
			}
		}
        return str.toString();
	}
 
    
}
